#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <math.h>

#include <map>
#include <vector>
#include <algorithm>

using namespace std;


int split(vector<string>& v, const string& str, char c)
{
v.clear();
string::const_iterator s = str.begin();
while (true) {
  string::const_iterator begin = s;

  while (*s != c && s != str.end()) { ++s; }

    v.push_back(string(begin, s));
    if (s == str.end()) {
        break;
    }
    if (++s == str.end()) {
       v.push_back("");
       break;
    }
  }
  return v.size();
}

void uso(char *prog ){


   cout << "./" << prog << " -f <archivo_tipos>" << endl;
   exit(1);


}


int main(int argc, char *argv[ ]){



ifstream tipos_default("tipos_default.dat");
ofstream salida("salida.dat");
ofstream tipos_en_archivo("tipos_en_archivo.dat");
ofstream log("preprocesado.log");



string linea;
vector<string> vec(2);

map<string,int> tipos;
map<string,int>::iterator it;

int f=0;

ifstream archivo;

for(int i = 0; i < argc; i++){
 if(!strcmp(argv[i],"-f")){
    f=i+1;


    archivo.open(argv[f]);

    if(!archivo){

      cout << "Fallo al intentar abrir el archivo: " << argv[f] << endl;

    }



 }

}




int mayor=0;
int aux=0;
while (! tipos_default.eof() ){


  getline (tipos_default,linea);

  split(vec,linea,',');

if(mayor+1==atoi(vec[0].c_str())){

   tipos[vec[1].c_str()]=atoi(vec[0].c_str());

}



  log << tipos[vec[1].c_str()] << " " << vec[1].c_str() << endl;
  aux=atoi(vec[0].c_str());
  if(mayor<aux){

    mayor=aux;

  }

}

log << "REVISANDO EL TIPO " << tipos["ffb_clear"] << endl;



ofstream tipos_def("tipos_default.dat",ios::app);
    fprintf(stderr,"got to line %d\n",__LINE__);
map<string,int> tipp;
while (! archivo.eof())
{

  getline (archivo,linea);
  tipp[linea]=1;
  if(strcmp(linea.c_str(),"")==0||strcmp(linea.c_str()," ")==0){
	break;
  }

//  split(vec,linea);

    if(strcmp(linea.c_str(),"-")!=0){

       log << "WTF?-" << linea << "- " << endl;

    }


  it=tipos.find(linea);

  if( it != tipos.end()){

if(tipos[linea]!=0) log << "tipo: " <<tipos[linea] << endl;


    cout << tipos[linea] << endl;

  }else{

//    cout << "FAIL: " << linea << endl;
    mayor++;
    tipos_def << mayor << "," << linea << endl;
    cout << mayor << endl;

  }


}




map<string, int>::const_iterator itera;

for (itera=tipp.begin(); itera != tipp.end(); ++itera) {

  tipos_en_archivo << itera->first << endl;



}




}
